package ar.edu.caece.dns.modelo.servidor.impl;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

import org.apache.log4j.Logger;

import ar.edu.caece.dns.modelo.registros.NombreDominio;
import ar.edu.caece.dns.modelo.servidor.Request;
import ar.edu.caece.dns.modelo.servidor.Response;
import ar.edu.caece.dns.modelo.servidor.Servidor;

@Deprecated
/*
 * fue reemplazada por SocketListener, SocketListenerHandler y RequestController
 */
public class ServidorDecorator implements Servidor {

	private Logger logger = Logger.getLogger(this.getClass());

	private static final boolean AUTO_FLUSH = true;

	private static int puerto = 8085;

	private Servidor servidor;

	private NombreDominio nombreDominio;

	public Servidor getServidor() {
		return servidor;
	}

	public void setServidor(Servidor servidor) {
		this.servidor = servidor;
	}

	public void setNombreNominio(NombreDominio nombreDominio) {
		this.nombreDominio = nombreDominio;
	}

	public NombreDominio getNombreDominio() {
		return nombreDominio;
	}

	@Override
	public Response service(Request request) {
		Response response = null;

		ServerSocket serverSocket = null;
		Socket clientSocket = null;
		String inputLine = "";

		// se crea el serverSocket.
		try {
			serverSocket = new ServerSocket(puerto);
		} catch (IOException e) {
			logger.error("could not get I/O from socketServer for this port: "
					+ puerto, e);
			System.exit(1);
		}

		boolean conectado = true;

		while (conectado) {

			response = new Response();
			// se pone a la escucha de una conexion a este socket.
			try {
				clientSocket = serverSocket.accept();
			} catch (IOException e) {
				logger.error("accept fail from this port: " + puerto);
				System.exit(1);
			}

			PrintWriter out = null;
			BufferedReader in = null;

			try {
				out = new PrintWriter(clientSocket.getOutputStream(),
						AUTO_FLUSH);
				in = new BufferedReader(new InputStreamReader(
						clientSocket.getInputStream()));

				while ((inputLine = in.readLine()) != null) {

					logger.debug("mensaje recibido: " + inputLine);

					response = servidor.service(new Request(inputLine));

					out.println(response);

					if (inputLine.equalsIgnoreCase("salir!")) {
						conectado = false;
					}
				}

				out.close();
				in.close();
				clientSocket.close();
				serverSocket.close();

			} catch (IOException ioe) {
				logger.error("Error de comunicacion", ioe);
			}

		}

		return response;
	}

}
